<?php
/**
 * 数据库连接类
 * 提供数据库连接和基础操作功能
 */

class Database {
    private $connection;
    private static $instance = null;
    
    /**
     * 构造函数 - 创建数据库连接
     */
    private function __construct() {
        // 加载数据库配置
        require_once __DIR__ . '/../config/database.php';
        
        try {
            // 创建PDO连接
            $dsn = "mysql:host=".DB_HOST.";dbname=".DB_NAME.";charset=".DB_CHARSET.";port=".DB_PORT;
            $options = [
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
                PDO::ATTR_EMULATE_PREPARES => false,
            ];
            
            $this->connection = new PDO($dsn, DB_USERNAME, DB_PASSWORD, $options);
            
            if (DB_DEBUG) {
                error_log("数据库连接成功");
            }
        } catch (PDOException $e) {
            // 记录错误，但不显示详细信息给用户
            error_log("数据库连接失败: " . $e->getMessage());
            die("数据库连接失败。请联系管理员。");
        }
    }
    
    /**
     * 获取数据库连接实例（单例模式）
     */
    public static function getInstance() {
        if (self::$instance === null) {
            self::$instance = new self();
        }
        return self::$instance;
    }
    
    /**
     * 获取PDO连接
     */
    public function getConnection() {
        return $this->connection;
    }
    
    /**
     * 执行SQL查询
     * @param string $sql SQL语句
     * @param array $params 参数数组
     * @return PDOStatement 查询结果
     */
    public function query($sql, $params = []) {
        try {
            $stmt = $this->connection->prepare($sql);
            $stmt->execute($params);
            return $stmt;
        } catch (PDOException $e) {
            error_log("查询执行错误: " . $e->getMessage() . " SQL: " . $sql);
            throw $e;
        }
    }
    
    /**
     * 获取单行结果
     * @param string $sql SQL语句
     * @param array $params 参数数组
     * @return array|null 结果数组或null
     */
    public function fetchRow($sql, $params = []) {
        $stmt = $this->query($sql, $params);
        return $stmt->fetch();
    }
    
    /**
     * 获取所有结果
     * @param string $sql SQL语句
     * @param array $params 参数数组
     * @return array 结果数组
     */
    public function fetchAll($sql, $params = []) {
        $stmt = $this->query($sql, $params);
        return $stmt->fetchAll();
    }
    
    /**
     * 获取单个值
     * @param string $sql SQL语句
     * @param array $params 参数数组
     * @return mixed 单个值
     */
        
    /**
     * 获取单个值（fetchOne的别名，为兼容性）
     * @param string $sql SQL语句
     * @param array $params 参数数组
     * @return mixed 单个值
     */
    public function fetchColumn($sql, $params = []) {
        return $this->fetchOne($sql, $params);
    }

    public function fetchOne($sql, $params = []) {
        $stmt = $this->query($sql, $params);
        return $stmt->fetchColumn();
    }
    
    /**
     * 插入记录
     * @param string $table 表名
     * @param array $data 要插入的数据
     * @return int 插入ID
     */
    public function insert($table, $data) {
        // 添加表前缀
        $table = DB_PREFIX . $table;
        
        $fields = array_keys($data);
        $placeholders = array_fill(0, count($fields), '?');
        
        $sql = "INSERT INTO {$table} 
                (" . implode(', ', $fields) . ") 
                VALUES (" . implode(', ', $placeholders) . ")";
                
        $this->query($sql, array_values($data));
        return $this->connection->lastInsertId();
    }
    
    /**
     * 更新记录
     * @param string $table 表名
     * @param array $data 要更新的数据
     * @param string $where WHERE条件
     * @param array $params WHERE参数
     * @return int 影响的行数
     */
    public function update($table, $data, $where, $params = []) {
        // 添加表前缀
        $table = DB_PREFIX . $table;
        
        $set = [];
        foreach ($data as $field => $value) {
            $set[] = "{$field} = ?";
        }
        
        $sql = "UPDATE {$table} SET " . implode(', ', $set) . " WHERE " . $where;
        $stmt = $this->query($sql, array_merge(array_values($data), $params));
        
        return $stmt->rowCount();
    }
    
    /**
     * 删除记录
     * @param string $table 表名
     * @param string $where WHERE条件
     * @param array $params WHERE参数
     * @return int 影响的行数
     */
    public function delete($table, $where, $params = []) {
        // 添加表前缀
        $table = DB_PREFIX . $table;
        
        $sql = "DELETE FROM {$table} WHERE " . $where;
        $stmt = $this->query($sql, $params);
        
        return $stmt->rowCount();
    }
} 